type dynamic_load_status = typeof mount_before | typeof mount_after | undefined;

/**
 * 在 锚定元素 之后 添加 当前元素
 */
const mount_after = 'after';

/**
 * 在 锚定元素 之前 添加 当前元素
 */
const mount_before = 'before';

/**
 * 生成元素
 * @param container 目标 元素 容器
 * @param nod 待装配元素
 */
export function packNode(
  container: null,
  nod: HTMLElement | HTMLElement[]
): HTMLElement;

/**
 * 装配 元素
 * @param container 目标 元素 容器
 * @param nod 待装配元素
 */
export function packNode(
  container: HTMLElement,
  nod: HTMLElement | HTMLElement[]
): void;

/**
 * 锚定 元素
 * @param container 目标 元素 容器
 * @param nod 待装配元素
 * @param dynamicLoad 装载位置 置前 置后
 * @param childNode 锚定元素
 */
export function packNode(
  container: HTMLElement,
  nod: HTMLElement | HTMLElement[],
  dynamicLoad: dynamic_load_status,
  childNode: HTMLElement
): void;

export function packNode(
  container: HTMLElement | null,
  nod: HTMLElement | HTMLElement[],
  dynamicLoad?: dynamic_load_status,
  childNode?: HTMLElement
) {
  // 返回 新创建的元素 本身
  if (container == null) {
    // container = nod;
    return nod;
  }

  if (Array.isArray(nod)) {
    if (nod.length == 0) return;
    _packNode_Arr(container, nod, dynamicLoad, childNode!);
    return;
  } else {
    _packNode(container, nod, dynamicLoad, childNode!);
    return;
  }
}

function _packNode_Arr(container: HTMLElement, nod: HTMLElement[]): void;

function _packNode_Arr(
  container: HTMLElement,
  nod: HTMLElement[],
  dynamicLoad: dynamic_load_status,
  childNode: HTMLElement
): void;

/**
 * 按 次序 将 元素组 添加到 锚定元素 指定位置
 * @param container 目标 元素 容器
 * @param nod 待装配元素
 * @param dynamicLoad 装载位置 置前 置后
 * @param childNode 锚定元素
 */
function _packNode_Arr(
  container: HTMLElement,
  nod: HTMLElement[],
  dynamicLoad?: dynamic_load_status,
  childNode?: HTMLElement
) {
  // 第一个元素 定位
  _packNode(container, nod[0], dynamicLoad, childNode!);

  // 按序 加载元素
  for (let i = 1; i < nod.length; i++) {
    _packNode(container, nod[i], mount_after, nod[i - 1]);
  }
}

function _packNode(container: HTMLElement, nod: HTMLElement): void;

function _packNode(
  container: HTMLElement,
  nod: HTMLElement,
  dynamicLoad: dynamic_load_status,
  childNode: HTMLElement
): void;

function _packNode(
  container: HTMLElement,
  nod: HTMLElement,
  dynamicLoad?: dynamic_load_status,
  childNode?: HTMLElement
) {
  if (dynamicLoad == undefined) {
    // 默认 appendChild
    container.appendChild(nod);
    return;
  }

  // 将 元素 放置到 给定的 子元素 前
  if (dynamicLoad == mount_before) {
    container.insertBefore(nod, childNode!);
    return;
  }
  // 将 元素 放置到 给定的 子元素 后
  if (dynamicLoad == mount_after) {
    container.insertBefore(nod, childNode!.nextElementSibling);
    return;
  }
}
